25 LPM 低功耗深度软件待机模式

开发板官网(https://www.edevkit.com/)
本系列教程目录:
- 瑞萨单片机开发教程[一] e2-studio + DAP LINK开发环境搭建
- 瑞萨单片机开发教程[二] Keil/RASC开发环境搭建
- 瑞萨单片机开发教程[三] 新建RASC工程
- 瑞萨单片机开发教程[四] GPIO输出——led实验
- 瑞萨单片机开发教程[五] GPIO输入——按键key实验
- 瑞萨单片机开发教程[六] ICU外部中断实验
- 瑞萨单片机开发教程[七] SCI UART串口通信实验
- 瑞萨单片机开发教程[八] DMAC 串口数据传输实验
- 瑞萨单片机开发教程[九] ADC 电压采集实验
LPM 低功耗深度软件待机模式实验
本章目标:
- 了解 RA6M5 处理器的低功耗及其工作原理;
- 学会使用 RASC 配置低功耗深度软件待机模式、使用 API 函数;
硬件设计(略,参见配套硬件原理图)
软件设计
新建工程
复制一份"24 LPM_Snooze_Mode"并修改文件夹名为"25 LPM_Deep_Standby_Mode",双击打开"EBF_RA6M5.uvprojx"工程,通过 Keil 的新建文件新建"lpm_deep.c"和"lpm_deep.h",保存到工程目录下的 \\src 文件夹下。
FSP 配置
Keil 界面选择“Tools”→“RA Smart Configurator”打开 RASC 界面。
添加 LPM Stack 模块。

设置 IWDT 属性
设置名称和深度待机模式。

下一步在“Deep Standby Options”设置“Cancel Source”和“Cancel Edges”。
选择配置的按键中断 irq9 和 irq10,edges 选择 irq9 的下降沿。

配置完成之后可以按下快捷键“Ctrl + S”保存,最后点击“Generate Project Content”按钮,让软件自动生成配置代码即可。
程序设计
设计程序,配置 irq9 和 irq10 两个中断,在程序初始化后检测深度唤醒的中断源,打印到串口,LED 亮 3s 后进入循环,执行测试函数,LED 闪烁两次后进入深度待机模式,等待中断唤醒,按下按键中断唤醒程序,观察现象。
- 打开低功耗模块
R_LPM_Open(sleep.p_ctrl, sleep.p_cfg);
- 进入低功耗模式
R_LPM_LowPowerModeEnter(sleep.p_ctrl);
程序编写
在 lpm_deep.h 头文件里定义初始化函数、测试函数。
#ifndef __BSP_LPM_DEEP_STANDBY_H
#define __BSP_LPM_DEEP_STANDBY_H
#include "hal_data.h"
//检测唤醒中断源
void lpm_deep_standby_restart_detection(void);
//深度待机模式测试
void lpm_deep_standby_led_test(void);
#endif
在 lpm_deep.c 里实现初始化函数、测试函数。
#include "lpm_deep.h"
#include "led.h"
#include "stdio.h"
//唤醒重启检测中断源
void lpm_deep_standby_restart_detection(void)
{
R_BSP_PinAccessEnable();
if (1U == R_SYSTEM->RSTSR0_b.DPSRSTF)
{
//从深度软件待机模式唤醒后清除IOkeep位
R_LPM_IoKeepClear (NULL);
//清除唤醒标志位
R_SYSTEM->RSTSR0_b.DPSRSTF = 0;
//判断唤醒源是IRQ-9还是IRQ-10
if (R_SYSTEM->DPSIFR1 >> 1 & 0x01U)
{
printf("mcu waken from IRQ-9\r\n");
}
else if (R_SYSTEM->DPSIFR1 >> 2 & 0x01U)
{
printf("mcu waken from IRQ-10\r\n");
}
}
}
//深度软件待机模式测试
void lpm_deep_standby_led_test(void)
{
//闪烁两次
LED1_ON();
R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);
LED1_OFF();
R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);
LED1_ON();
R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);
LED1_OFF();
printf("mcu enter deep standby mode\r\n");
R_LPM_Open(g_deep.p_ctrl, g_deep.p_cfg);
//这一句开始进入深度待机模式,后面的代码将不会执行,中断唤醒也会重启运行
R_LPM_LowPowerModeEnter(g_deep.p_ctrl);
//这一句将不会运行到,
printf("mcu exit deep standby mode\r\n");
}
在 hal_entry.c 文件中添加头文件 lpm_deep.h。
void hal_entry(void)
{
/* TODO: add your own code here */
led_Init();
uart0_Init();
key_IRQ_Init();
//检测唤醒重启的中断源
lpm_deep_standby_restart_detection();
LED1_ON();
R_BSP_SoftwareDelay(3, BSP_DELAY_UNITS_SECONDS);
while(1)
{
//进入深度软件待机
lpm_deep_standby_led_test();
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
下载验证
连接下载器,将程序编译并下载到开发板之后,重新上电复位开发板,程序启动初始化完。
初始化后执行中断源检测函数,LED 灯亮 3s 后,进入循环,LED 闪烁两次后串口打印“mcu enter deep standby mode”,进入深度待机模式,等待中断唤醒,后面的代码将不会执行。按下按键,中断唤醒后程序重启重头开始运行,打印检测到的中断源。
